package com.cskaoyan.javase.oop3._2inner._5anonymous._1basic;

/**
 * 匿名内部的语法:
 *      new 类名或者接口名(){
 *          // 某类名或接口名的子类的类体
 *      };
 *
 * 首先,我们仍然需要知道匿名内部类,类体中的成员特点:
 *      1.和局部内部类一样,没有静态声明
 *      2.匿名内部类的类体中,能不能定义构造器呢?
 *          匿名内部类的语法中有一个"()"
 *          这个"()"有什么含义呢?
 *
 *      "()"是有含义的,当语法中,创建的是类的子类对象,"()"小括号表示给类的构造器传参
 *      给父类构造器传参的
 *      但是当创建接口的匿名内部类对象时,由于接口没有构造器
 *          所以这时的"()"是一个纯粹的语法标志,不能省略,也没有任何作用
 *
 *      3.由于匿名子类的类名不可知,而且匿名内部类的语法中也没有预留位置给子类构造器传参
 *      所以匿名内部类没有构造器
 *
 * @since 16:14
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int a = 10;
        // static int num2;
        new IA() {
            @Override
            public void test() {
                System.out.println(a);
                // System.out.println(a++);
                System.out.println("我是接口的匿名内部类对象实现");
            }
        };

        System.out.println(new A(100) {
        }.a);

        System.out.println(new BaseA(200) {
        }.num);
    }
}

class A {
    int a = 10;

    public A(int a) {
        this.a = a;
    }
}

class BaseA {
    int num;

    public BaseA(int num) {
        this.num = num;
    }
}

interface IA {
    void test();
}